Django'ning testlash freymvorkiga chuqur kirish, yanada samarali va ishonchli testlar yozishingizga yordam berish uchun TestCase va TransactionTestCase'ni solishtirish va kontrastlash.
Python Django Testlash: TestCase va TransactionTestCase
Testlash dasturiy ta'minotni ishlab chiqishning muhim jihati bo'lib, sizning dasturingiz kutilganidek ishlashini va vaqt o'tishi bilan mustahkamligini ta'minlaydi. Django, mashhur Python veb-freymvorki, samarali testlar yozishingizga yordam berish uchun kuchli testlash freymvorkini taqdim etadi. Ushbu blog posti Django'ning testlash freymvorki ichidagi ikkita asosiy sinfga chuqur kirib boradi: TestCase
va TransactionTestCase
. Biz ularning farqlarini, foydalanish holatlarini o'rganamiz va testingiz ehtiyojlari uchun to'g'ri sinfni tanlashda yordam berish uchun amaliy misollar keltiramiz.
Nima uchun Django'da testlash muhim?
TestCase
va TransactionTestCase
xususiyatlariga sho'ng'ishdan oldin, Django ishlab chiqishda testlash nima uchun juda muhimligini qisqacha muhokama qilaylik:
- Kod sifatini ta'minlaydi: Testlar ishlab chiqish jarayonida xatolarni erta aniqlashga yordam beradi va ularni ishlab chiqarishga yo'l qo'ymaslikning oldini oladi.
- Refaktoringni osonlashtiradi: Keng qamrovli test to'plami bilan siz kodingizni ishonchli tarzda refaktoring qilishingiz mumkin, agar biron bir regressiya kiritsangiz, testlar sizni ogohlantiradi.
- Hamkorlikni yaxshilaydi: Yaxshi yozilgan testlar kodingiz uchun hujjat sifatida xizmat qiladi va boshqa ishlab chiquvchilar uchun tushunish va hissa qo'shishni osonlashtiradi.
- Testga asoslangan ishlab chiqishni (TDD) qo'llab-quvvatlaydi: TDD - bu haqiqiy kodni yozishdan oldin testlarni yozadigan ishlab chiqish usuli. Bu sizni dasturingizning kerakli xatti-harakatlari haqida oldindan o'ylashga majbur qiladi, bu esa toza va oson saqlanadigan kodga olib keladi.
Django'ning testlash freymvorki: Qisqacha ko'rinish
Django'ning testlash freymvorki Pythonning o'rnatilgan unittest
moduliga asoslangan. U Django ilovalarini testlashni osonlashtiradigan bir nechta xususiyatlarni taqdim etadi, jumladan:
- Testni aniqlash: Django loyihangiz ichidagi testlarni avtomatik ravishda aniqlaydi va ishga tushiradi.
- Test yuguruvchi: Django testlaringizni bajaradigan va natijalarni xabar qiladigan test yuguruvchini taqdim etadi.
- Tasdiqlash usullari: Django kodingizning kutilgan xatti-harakatlarini tekshirish uchun foydalanishingiz mumkin bo'lgan tasdiqlash usullarini taqdim etadi.
- Mijoz: Django'ning test mijozlari sizga shakllarni topshirish yoki API so'rovlarini yuborish kabi foydalanuvchi bilan o'zaro aloqalarni simulyatsiya qilishga imkon beradi.
- TestCase va TransactionTestCase: Bular Django'da testlar yozish uchun ikkita asosiy sinf bo'lib, biz ularni batafsil ko'rib chiqamiz.
TestCase: Tez va samarali birlik testi
TestCase
- Django'da birlik testlarini yozish uchun asosiy sinf. U har bir test holati uchun toza ma'lumotlar bazasi muhitini ta'minlaydi, bu esa testlar ajratilganligini va bir-biriga xalaqit bermasligini ta'minlaydi.
TestCase qanday ishlaydi
Siz TestCase
dan foydalanganda, Django har bir test usuli uchun quyidagi amallarni bajaradi:
- Test ma'lumotlar bazasini yaratadi: Django har bir test uchun alohida test ma'lumotlar bazasini yaratadi.
- Ma'lumotlar bazasini tozalaydi: Har bir test usuli oldidan Django test ma'lumotlar bazasini tozalaydi va barcha mavjud ma'lumotlarni olib tashlaydi.
- Test usulini ishga tushiradi: Django siz belgilagan test usulini bajaradi.
- Tranzaktsiyani orqaga qaytaradi: Har bir test usulidan so'ng, Django tranzaktsiyani orqaga qaytaradi va test davomida ma'lumotlar bazasida qilingan har qanday o'zgarishni bekor qiladi.
Ushbu yondashuv har bir test usuli toza holatdan boshlanishini va ma'lumotlar bazasida qilingan har qanday o'zgarish avtomatik ravishda qaytarilishini ta'minlaydi. Bu TestCase
ni birlik testlash uchun ideal qiladi, bunda siz dasturingizning individual komponentlarini alohida test qilmoqchisiz.
Misol: Oddiy modelni testlash
TestCase
dan foydalangan holda Django modelini testlashning oddiy misolini ko'rib chiqaylik:
from django.test import TestCase
from .models import Product
class ProductModelTest(TestCase):
def test_product_creation(self):
product = Product.objects.create(name="Test Product", price=10.00)
self.assertEqual(product.name, "Test Product")
self.assertEqual(product.price, 10.00)
self.assertTrue(isinstance(product, Product))
Ushbu misolda biz Product
model nusxasini yaratishni test qilmoqdamiz. test_product_creation
usuli yangi mahsulot yaratadi va keyin mahsulotning atributlari to'g'ri o'rnatilganligini tekshirish uchun tasdiqlash usullaridan foydalanadi.
TestCase dan qachon foydalanish kerak
TestCase
odatda Django testlash stsenariylarining aksariyati uchun afzalroq tanlovdir. U tez, samarali va har bir test uchun toza ma'lumotlar bazasi muhitini ta'minlaydi. TestCase
dan quyidagi hollarda foydalaning:
- Siz dasturingizning individual modellari, ko'rinishlari yoki boshqa komponentlarini test qilyapsiz.
- Siz testlaringiz ajratilganligiga va bir-biriga xalaqit bermasligiga ishonch hosil qilmoqchisiz.
- Siz bir nechta tranzaktsiyalarni qamrab oluvchi murakkab ma'lumotlar bazasi o'zaro ta'sirlarini test qilishingiz shart emas.
TransactionTestCase: Murakkab ma'lumotlar bazasi o'zaro ta'sirlarini testlash
TransactionTestCase
- Django'da testlar yozish uchun yana bir sinf, ammo u ma'lumotlar bazasi tranzaktsiyalarini qanday boshqarishi bilan TestCase
dan farq qiladi. Har bir test usulidan so'ng tranzaktsiyani orqaga qaytarish o'rniga, TransactionTestCase
tranzaktsiyani bajaradi. Bu uni signallar yoki atom tranzaktsiyalar kabi bir nechta tranzaktsiyalarni qamrab oluvchi murakkab ma'lumotlar bazasi o'zaro ta'sirlarini testlash uchun mos qiladi.
TransactionTestCase qanday ishlaydi
Siz TransactionTestCase
dan foydalanganda, Django har bir test holati uchun quyidagi amallarni bajaradi:
- Test ma'lumotlar bazasini yaratadi: Django har bir test uchun alohida test ma'lumotlar bazasini yaratadi.
- Ma'lumotlar bazasini tozalamaydi: TransactionTestCase har bir test oldidan ma'lumotlar bazasini avtomatik ravishda tozalamaydi. U har bir test ishga tushirilishidan oldin ma'lumotlar bazasi izchil holatda bo'lishini kutadi.
- Test usulini ishga tushiradi: Django siz belgilagan test usulini bajaradi.
- Tranzaktsiyani bajaradi: Har bir test usulidan so'ng, Django tranzaktsiyani bajaradi va o'zgarishlarni test ma'lumotlar bazasida doimiy qiladi.
- Jadvallarni kesadi: TransactionTestCase'dagi barcha testlar tugagandan so'ng, ma'lumotlarni tozalash uchun jadvallar kesiladi.
TransactionTestCase
har bir test usulidan so'ng tranzaktsiyani bajarishi sababli, testlaringiz ma'lumotlar bazasini nomuvofiq holatda qoldirmasligiga ishonch hosil qilish muhimdir. Keyingi testlarga xalaqit bermaslik uchun test davomida yaratilgan har qanday ma'lumotlarni qo'lda tozalashingiz kerak bo'lishi mumkin.
Misol: Signallarni testlash
TransactionTestCase
dan foydalangan holda Django signallarini testlash misolini ko'rib chiqaylik:
from django.test import TransactionTestCase
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Product, ProductLog
@receiver(post_save, sender=Product)
def create_product_log(sender, instance, created, **kwargs):
if created:
ProductLog.objects.create(product=instance, action="Created")
class ProductSignalTest(TransactionTestCase):
def test_product_creation_signal(self):
product = Product.objects.create(name="Test Product", price=10.00)
self.assertEqual(ProductLog.objects.count(), 1)
self.assertEqual(ProductLog.objects.first().product, product)
self.assertEqual(ProductLog.objects.first().action, "Created")
Ushbu misolda biz yangi Product
nusxasi yaratilganda ProductLog
nusxasini yaratadigan signalni test qilmoqdamiz. test_product_creation_signal
usuli yangi mahsulot yaratadi va keyin mos keladigan mahsulot jurnal yozuvi yaratilganligini tekshiradi.
TransactionTestCase dan qachon foydalanish kerak
TransactionTestCase
odatda bir nechta tranzaktsiyalarni qamrab oluvchi murakkab ma'lumotlar bazasi o'zaro ta'sirlarini test qilishingiz kerak bo'lgan maxsus stsenariylarda qo'llaniladi. Quyidagi hollarda TransactionTestCase
dan foydalanishni o'ylab ko'ring:
- Siz ma'lumotlar bazasi operatsiyalari tomonidan qo'zg'atiladigan signallarni test qilyapsiz.
- Siz bir nechta ma'lumotlar bazasi operatsiyalarini o'z ichiga olgan atom tranzaktsiyalarini test qilyapsiz.
- Siz bir qator tegishli operatsiyalardan keyin ma'lumotlar bazasining holatini tekshirishingiz kerak.
- Siz testlar orasida saqlanib qolish uchun avto-o'sib boradigan ID-ga tayanadigan koddan foydalanmoqdasiz (garchi bu odatda yomon amaliyot deb hisoblansa ham).
TransactionTestCase dan foydalanganda muhim fikrlar
TransactionTestCase
tranzaktsiyalarni bajarishi sababli, quyidagi fikrlardan xabardor bo'lish muhimdir:
- Ma'lumotlar bazasini tozalash: Keyingi testlarga xalaqit bermaslik uchun test davomida yaratilgan har qanday ma'lumotlarni qo'lda tozalashingiz kerak bo'lishi mumkin. Test ma'lumotlarini boshqarish uchun
setUp
vatearDown
usullaridan foydalanishni o'ylab ko'ring. - Testni ajratish:
TransactionTestCase
TestCase
bilan bir xil darajadagi testni ajratishni ta'minlamaydi. Testlar o'rtasidagi potentsial o'zaro ta'sirlarga e'tibor bering va testlaringiz oldingi testlardan ma'lumotlar bazasi holatiga bog'liq emasligiga ishonch hosil qiling. - Ishlash:
TransactionTestCase
tranzaktsiyalarni bajarishni o'z ichiga olganligi sababliTestCase
dan sekinroq bo'lishi mumkin. Undan ehtiyotkorlik bilan va faqat zarur bo'lganda foydalaning.
Django testlash uchun eng yaxshi amaliyotlar
Django'da testlar yozishda yodda tutish kerak bo'lgan ba'zi eng yaxshi amaliyotlar:
- Aniq va qisqa testlar yozing: Testlarni tushunish va saqlash oson bo'lishi kerak. Test usullari va tasdiqlashlar uchun tavsiflovchi nomlardan foydalaning.
- Bir vaqtning o'zida bitta narsani test qiling: Har bir test usuli kodingizning bitta jihatini test qilishga qaratilgan bo'lishi kerak. Bu test muvaffaqiyatsiz bo'lganda muvaffaqiyatsizlik manbasini aniqlashni osonlashtiradi.
- Ma'noli tasdiqlashlardan foydalaning: Kodingizning kutilgan xatti-harakatlarini aniq ifodalaydigan tasdiqlash usullaridan foydalaning. Django turli stsenariylar uchun boy tasdiqlash usullarini taqdim etadi.
- Arrange-Act-Assert naqshiga amal qiling: Testlaringizni Arrange-Act-Assert naqshiga muvofiq tuzing: Test ma'lumotlarini tartibga soling, test ostidagi kodda harakat qiling va kutilgan natijani tasdiqlang.
- Testlaringizni tez saqlang: Sekin testlar ishlab chiquvchilarni ularni tez-tez ishga tushirishdan to'xtatishi mumkin. Bajarish vaqtini minimallashtirish uchun testlaringizni optimallashtiring.
- Test ma'lumotlari uchun moslamalardan foydalaning: Moslamalar test ma'lumotlar bazasiga dastlabki ma'lumotlarni yuklashning qulay usuli hisoblanadi. Barqaror va qayta foydalanish mumkin bo'lgan test ma'lumotlarini yaratish uchun moslamalardan foydalaning. ID-larni qattiq kodlashdan qochish uchun moslamalarda tabiiy kalitlardan foydalanishni o'ylab ko'ring.
- pytest kabi testlash kutubxonasidan foydalanishni o'ylab ko'ring: Django'ning o'rnatilgan testlash freymvorki kuchli bo'lsa-da, pytest kabi kutubxonalar qo'shimcha xususiyatlar va moslashuvchanlikni taklif qilishi mumkin.
- Yuqori test qamroviga intiling: Kodingiz to'liq testdan o'tganligiga ishonch hosil qilish uchun yuqori test qamroviga intiling. Test qamrovini o'lchash va ko'proq testlashga muhtoj bo'lgan sohalarni aniqlash uchun qamrov vositalaridan foydalaning.
- Testlarni CI/CD liniyangizga integratsiya qiling: Uzluksiz integratsiya va uzluksiz joylashtirish (CI/CD) liniyangizning bir qismi sifatida testlaringizni avtomatik ravishda ishga tushiring. Bu har qanday regressiya ishlab chiqish jarayonida erta qo'lga olinishini ta'minlaydi.
- Haqiqiy dunyo stsenariylarini aks ettiruvchi testlar yozing: Ilovangizni foydalanuvchilar undan qanday foydalanishini taqlid qiladigan tarzda test qiling. Bu oddiy birlik testlarida ko'rinmasligi mumkin bo'lgan xatolarni aniqlashga yordam beradi. Misol uchun, shakllarni test qilishda xalqaro manzillar va telefon raqamlaridagi o'zgarishlarni ko'rib chiqing.
Internatsionalizatsiya (i18n) va Testlash
Global auditoriya uchun Django ilovalarini ishlab chiqishda internatsionalizatsiya (i18n) va lokalizatsiyani (l10n) hisobga olish muhimdir. Testlaringiz turli tillarni, sana formatlarini va valyuta belgilarini qamrab olishini ta'minlang. Mana ba'zi maslahatlar:
- Turli til sozlamalari bilan test qiling: Ilovangizni turli til sozlamalari bilan test qilish uchun Django'ning
override_settings
dekoratoridan foydalaning. - Testlaringizda lokalizatsiya qilingan ma'lumotlardan foydalaning: Ilovangiz turli xil sana formatlarini, valyuta belgilarini va boshqa mahalliy ma'lumotlarni to'g'ri ishlatishini ta'minlash uchun test moslamalarida va test usullarida mahalliy ma'lumotlardan foydalaning.
- Tarjima satrlaringizni test qiling: Tarjima satrlaringiz to'g'ri tarjima qilinganligini va ular turli tillarda to'g'ri ko'rsatilishini tekshiring.
localize
shablon teglidan foydalaning: Shablonlaringizda sanalarni, raqamlarni va boshqa mahalliy ma'lumotlarni foydalanuvchining joriy mahalliy tiliga mos ravishda formatlash uchunlocalize
shablon teglidan foydalaning.
Misol: Turli til sozlamalari bilan testlash
from django.test import TestCase
from django.utils import translation
from django.conf import settings
class InternationalizationTest(TestCase):
def test_localized_date_format(self):
original_language = translation.get_language()
try:
translation.activate('de') # Nemis tilini faollashtiring
with self.settings(LANGUAGE_CODE='de'): # Sozlamalarda tilni o'rnating
from django.utils import formats
from datetime import date
d = date(2024, 1, 20)
formatted_date = formats.date_format(d, 'SHORT_DATE_FORMAT')
self.assertEqual(formatted_date, '20.01.2024')
finally:
translation.activate(original_language) # Asl tilni tiklang
Ushbu misol Django'ning translation
va formats
modullaridan foydalangan holda turli til sozlamalari bilan sanani formatlashni qanday test qilishni ko'rsatadi.
Xulosa
TestCase
va TransactionTestCase
o'rtasidagi farqlarni tushunish Django'da samarali va ishonchli testlar yozish uchun muhimdir. TestCase
odatda aksariyat test stsenariylari uchun afzalroq tanlov bo'lib, dasturingizning individual komponentlarini izolyatsiyada test qilishning tez va samarali usulini ta'minlaydi. TransactionTestCase
signallar yoki atom tranzaktsiyalari kabi bir nechta tranzaktsiyalarni qamrab oluvchi murakkab ma'lumotlar bazasi o'zaro ta'sirlarini test qilish uchun foydalidir. Eng yaxshi amaliyotlarga rioya qilib va internatsionalizatsiya jihatlarini hisobga olgan holda, siz Django ilovalaringizning sifati va saqlanishini ta'minlaydigan mustahkam test to'plamini yaratishingiz mumkin.